package com.lyf.language.practice.practice_6_21.lang;

import org.junit.Test;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 一、语言基础
 * 1. 变量、语句、关键字
 * 2. 数组、字符串
 * 3. Math类,BigDecimal类,Date类
 *
 *
 * @author LYF
 * @date 2022/6/21
 */
public class LangBaseTests {
    // 静态变量，存在方法区中，共享
    private static int a = 1;
    private static final int b = 2;
    // 存在栈
    private int a1 = 1;

    /**
     * 变量（变化的量---属性，表示状态）→ 数字、类     任何事务都是通过变量、状态去刻画抽象的，然后能力等通过行为方法表现
     * 世界是变化、发展的世界，社会是关系的总和，关系则是一个函数，物体则是一个特殊的变量集合，通过方法、操作去改变关系等
     * 开发、研究的过程：认识世界、分析业务（则是认识属性变量、分析关系的过程） → 建立模型 → 解决问题
     * 1. 静态变量（类变量）与非静态变量
     * 2. 成员变量（属性）与局部变量、传参变量
     * 3. 基本数据类（包装类问题，拆箱和装箱，atomic 原子类）和引用数据类型（弱引用，强引用,...）
     * 4. 常量（final关键字，可修饰类、变量 ）与变量
     * 5. 类与对象---实际上 类也相当于特殊的变量？粒度大小不一样，还具有一定的关系
     * -- Java中万物皆对象--
     * 归根结底--是计算（解决行为、方法）+存储（解决变量状态）--
     * 因此，需要了解变量（包括类）的存储（理清--存储层次  JVM（应用层） → OS（内存 缓存 磁盘） ）位置，
     * 明白 计算的过程（CPU---加法器，--，加减乘除，字符串操作，CRUD），计算的本质就是-- 数：加减乘除；字符串：匹配查找 ；集合：CRUD
     * 逻辑操作（ 顺序、判断、循环  →  +-/*,&|^,>>,match,search ）
     * 对应 程序层的操作，数据库的操作（查询为主），
     * -------JVM中的存储分区----------
     * 栈：虚拟机栈、本地方法栈
     * 堆：存储对象的位置
     * 方法区：存储静态变量
     * 常量池：
     */
    @Test
    public void testVariable(){
           int a=0;
           int[] arr={1,3};
           // this对象，传入this对象至方法栈中,this 解析找到该类，也可以使用this调用静态变量
           System.out.println(this.a+":"+this.a1+":"+a+":"+ Arrays.toString(arr));
           // 数组引用类型，传入的地址；
           test(a,arr);
           System.out.println(this.a+":"+this.a1+":"+a+":"+ Arrays.toString(arr));

//           Integer integer = new Integer(1);
//           int intValue = integer.intValue();

           System.out.println(EnumClass.CAPACITY);
           System.out.println(EnumKind.INTERNAL_SERVER_ERROR+":"+ EnumKind.INTERNAL_SERVER_ERROR.getMsg());

    }
    public void test(int a,int arr[]){
        // 常量不能改变---，常量的使用--见 enum,及定义controller path等场景
//        LangBaseTests.b++;//Cannot assign a value to final variable 'b'
        LangBaseTests.a++;
        this.a1++;
        a++;
        for(int i=0;i< arr.length;i++)
            arr[i]++;
    }


    /**
     * 语句
     * 1.三大基础语句
     * 2.方法（静态方法、非静态方法）
     * 返回值、入参、访问修饰符
     *
     */
    public void testCentence(){

    }

    /**
     * 数组、字符串
     * 1.数组和ArrayList的对比
     * 2.string的常用API
     * （1）基本操作
     * （2）匹配，equals（hashcode的作用）
     */
    @Test
    public void testArrStr(){
        String str = "hello";
        // synchronized-线程安全
        StringBuffer stringBuffer = new StringBuffer(str);
        StringBuilder stringBuilder = new StringBuilder();

        Integer[]iArr = {1,2,3,4,4,5,1,2,1,3};//new Integer[10]
        // 默认是10个，oldLen + oldLen >> 1 (1.5倍)
        //  int newLength = Math.max(minGrowth, prefGrowth) + oldLength;
        //考虑默认容量、存储结构（Object[] elementData）、扩容机制、基本API实现
        ArrayList<Integer> arrayList = new ArrayList<>(10);
        //  newThr = oldThr << 1; // double threshold
        // 考虑存储结构（Entry,链表+红黑树），扩容机制（默认--链表拓展--）-负载因子，冲突问题，hash，基本API的实现
        // CurrentHashMap的实现
        //HashMap
        arrayList.addAll(Arrays.asList(iArr));// arr → list
        arrayList.toArray();// list → arr
        arrayList.sort(Integer::compareTo);// sort   comparator--functionCode
        System.out.println(4>>1);
        // ==与equals，hashcode的作用
    }

    @Test
    public void testMath(){
        // 随机数
        Random random = new Random();
        random.nextInt(20);
        // final class Math private Math() {}
        // Math,StrictMath
        Math.floor(1.2);

        BigDecimal bigDecimal = new BigDecimal("1.3432");
        BigDecimal bigDecimal1 =bigDecimal.setScale(2,BigDecimal.ROUND_HALF_DOWN);
        System.out.println(bigDecimal1.doubleValue());

        Date date = new Date();
        System.out.println(date+":"+date.getTime());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dataStr = simpleDateFormat.format(date);
        System.out.println(dataStr);

    }

}
